package com.cctc.juc.source.Bitc.Glock.dlock.Amysql;
/**
 * 【MySQL 面试（热频）知识点】
 * 1. MySQL 索引热频面试题。
 * 1）什么是索引？有什么作用？
 * 索引是一种高效查找的数据结构，能够帮助我们快速检索数据库中的数据，通过减少磁盘寻道次数来提高 IO 查询效率。
 * 2）MySQL 中主要有哪些索引结构？
 * - 哈希索引，是基于哈希表实现的一种高效查找的数据结果，类似于 HashMap，当我们为某个列增加索引时，存储引擎将该列的哈希值作为关键字 key，将指向数据行的指针作为 value，查找的时间复杂度为 O(1)，一般用于 =、IN <=> 等精确查找，不适用于区间查找；
 * - B+ 树索引，BT 二叉树 -> BST 二叉查找树（链化） -> AVL 二叉平衡树 -> B 树（平衡多路查找树，即多叉 AVL 树，减少了 AVL 树的高度，增加了每个节点的孩子数量）-> B+树（只有叶子节点存放完整的数据记录，非叶子节点只放 KEY 索引值，使得每个节点存放尽可能多的 KEY 值，降低 B+ 树的高度，同时在叶子节点上增加前驱和后继指针，同时具备 B 树和链表的优点，方便区间查找、分页查找、随机查找和高效的随机写操作）。
 * 3）索引的分类：
 * - 主键索引，一个表只能有一个主键，且不允许有空值；
 * - 唯一索引，索引列的值必须唯一，但允许有空值，如果是组合索引，列值组合必须唯一；
 * - 普通索引，最基本的索引，没有任何限制；
 * - 组合索引，由多个列组合建立的索引，推荐使用，可以实现覆盖索引，提升查询效率，需满足最左匹配原则，但不适用于范围查询。
 * --> 组合索引的本质就是先按照第一列进行排序，然后再对第二列进行排序，以此类推，如果没有第一列，直接访问第二列肯定是无序的，因此使用组合索引时必须满足最左匹配原则。
 * 其他分类：
 * - 聚集索引：按照每张表的主键构造的一颗 B+ 树索引，每张表只能构建一颗聚集索引；
 * --> 如果表设置了主键，直接使用该主键建立聚集索引；
 * --> 否则使用表中第一个非空且唯一的列作为主键，建立聚集索引；
 * --> 否则创建一个 row_id 隐藏主键，建立聚集索引。
 * - 非聚集索引：二级索引，除了聚集索引外，可以建立任意多个非聚集索引。
 * 查询过程：
 * --> 如果查询条件为主键，则只需扫描一次聚集索引；
 * --> 否则，需要回表查询（先定位主键值，再定位行记录），即先扫描二级非聚集索引找到主键，然后再到聚集索引中进行查询。
 * - 覆盖索引：如果在一颗索引树上就能够查询到 SQL 所需要的所有列的数据，那么这个索引就是覆盖索引。因此，我们可以为被查询的多个字段建立组合索引，实现覆盖索引，无需回表就可查到数据，效率更高。
 * --> 使用覆盖索引优化查询的场景：全表 count 查询优化、列回表查询优化、分页查询等。
 * 4）什么情况会导致索引失效？
 * - 组合索引未使用最左匹配原则；
 * - like 未使用最左匹配原则；
 * - 如果列的数据类型是字符串，但没有使用引号，不满足最左匹配原则，也会导致索引失效；
 * - select *、or、is not null、not in、not exists、order by，以及在索引列上进行计算操作、函数运算操作会直接导致索引失效；
 * - 最后，如果 mysql 评估后认为全表扫描比使用索引更快，也会导致索引失效。
 * 5）索引下推（ICP），将索引查询结果下推到存储引擎，存储引擎会在回表查询之前对数据进行过滤，从而减少回表查询的次数。
 * 6）一个 B+树大概能存放多少条索引记录？
 * 一个页大概 16 KB，如果一条数据行占用 1 KB的内存空间，关键字 key 占用 10 个字节的话：
 * - 如果只有 1 层，最多可以存放 16 条记录；
 * - 如果有 2 层，则可以存放 1600 16 = 25600 条记录；
 * - 如果有 3 层的化，就可以存放 1600 1600 16 = 4000 多万条记录；
 * 因此，如果存储千万级别的数据，只需要三层 B+树就够了。
 * 7）为什么建议使用自增主键作为索引？
 * - 自增主键可以非常方便的构建 B+树索引，可以维持底层数据的顺序写入，索引维护也方便，读取数据时可以由 B+树索引进行二分查找，同时支持范围查找，范围查找结果自带顺序。
 * 8）为什么 MYISAM 查询性能好？
 * - 表级锁定机制，减少了锁定的资源竞争和系统开销，使得查询操作能够更快速地进行；
 * - 不支持事务处理，执行查询时不需要考虑事务的开销。
 * - 简单的表结构，不需要维护事务、回滚日志等信息；
 * - 高效的索引机制，使用 B+树索引来加速查询，而且索引文件较小，占用空间少；
 * - 全文索引支持，可以快速搜索文本内容。
 */